/********************************************************************
 * 项目名称                ：rochoc<p>
 * 包名称                  ：com.rochoc.autoupdate<p>
 * 文件名称                ：AUpdSrvProc.java<p>
 * 编写者                 ：kfzx-luoc<p>
 * 编写日期                ：2008-12-22<p>
 * 程序功能（类）描述    ：<p>
 * 自动更新服务端处理进程
 * 程序变更日期            ：
 * 变更作者                ：
 * 变更说明                ：
 ********************************************************************/
package com.abigdreamer.swing.app.autoupdate;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

/**
 * @author kfzx-luoc
 */
public class AUpdSrvProc extends Thread {

	protected Socket socket = null;
	protected InputStream socketIn;
	protected OutputStream socketOut;

//	protected byte bFlag[] = new byte[1];// 标识位
//	protected byte bCmd[] = new byte[8];// 命令

	public AUpdSrvProc(Socket socket) {
		this.socket = socket;
	}

	/**
	 * 接收客户端的请求，并进行处理
	 */
	public void run() {
		try {
			socketIn = socket.getInputStream();
			socketOut = socket.getOutputStream();
			// byte datahead[] = new byte[5];// 数据头部，第一位用于标识是数据，后四位为长度
			// byte buffer[] = new byte[AUPD.BUFFER_SIZE];// 存放数据头部和数据头部
			// byte data[] = new byte[AUPD.DATA_SIZE];// 存放具体的数据内容
			while (true) {

				String cmd = FileContract.unpackingCmd(socketIn);
				if (cmd == null) {
					socketOut.write(Config.packingCmd(AUPD.BYE));// 结束
					break;
				}

				if (cmd.equals(AUPD.BYE)) {// 结束链接
					socketOut.write(Config.packingCmd(AUPD.BYE));// 结束
					break;
				}

				findCmdToExecute(cmd);

			}// END while(ture)
				// 关闭资源
			socketIn.close();
			socketOut.close();
			socket.close();
		} catch (IOException e) {
			Config.print("处理客户端升级请求失败," + socket.getInetAddress() + "," + e);
			e.printStackTrace();
		}
	}

	protected List<Byte> cmdTypeList = new ArrayList<Byte>();
	protected List<String> cmdList = new ArrayList<String>();
	protected List<String> actionList = new ArrayList<String>();

	protected void registeCmd(String cmd, String action) {

		cmdTypeList.add(AUPD.CMD_DATA_SECT);
		cmdList.add(cmd);
		actionList.add(action);
	}

	@Deprecated
	protected void registeCmd(Byte cmdType, String cmd, String action) {

		cmdTypeList.add(cmdType);
		cmdList.add(cmd);
		actionList.add(action);
	}

	private boolean findCmdToExecute(String inCmd) throws IOException {
		boolean findCmd = false;
		for (int i = 0; i < cmdList.size(); i++) {
			String cmd = cmdList.get(i);
			if (cmd.equals(inCmd)) {

				findCmd = true;

				Object returnValue = null;
				try {
					returnValue = this.getClass().getMethod(actionList.get(i)).invoke(this);
				} catch (Exception e) {
					e.printStackTrace();
				}

				if (returnValue != null) {
					socketOut.write(Config.packingCmd(returnValue + ""));
				}
				break;
			}
		}

		if (!findCmd) {
			Config.print(socket.getInetAddress() + ":非期望标识位," + inCmd);
			socketOut.write(Config.packingCmd(AUPD.BYE));// 结束
			return true;
		}

		return findCmd;
	}

}